package com.lh.jianzhioffer.专项练习.链表;

import java.util.*;

/**
 * @author: linghao
 * @since: 2023/3/16
 * 设计一个支持在平均 时间复杂度 O(1) 下，执行以下操作的数据结构：
 *
 * insert(val)：当元素 val 不存在时返回 true ，并向集合中插入该项，否则返回 false 。
 * remove(val)：当元素 val 存在时返回 true ，并从集合中移除该项，否则返回 false 。
 * getRandom：随机返回现有集合中的一项。每个元素应该有 相同的概率 被返回
 *
 */
public class 插入删除和随机访问都是的容器030 {

    List<Integer> list = new ArrayList<>();
    //key为值，value为对应list下标
    Map<Integer,Integer> map = new HashMap<>();
    Random random = new Random();

    public boolean insert(int val) {
        if(map.containsKey(val))return false;
        list.add(val);
        map.put(val,list.size()-1);
        return true;
    }

    /** Removes a value from the set. Returns true if the set contained the specified element. */
    public boolean remove(int val) {
        if(!map.containsKey(val))return false;
        //将最后一位用下标替换到要删除数的位置上，然后删除最后一位数
        Integer idx = map.get(val);
        Integer last = list.get(list.size() - 1);
        list.set(idx,last);
        map.put(last,idx);
        list.remove(list.size()-1);
        map.remove(val);
        return true;
    }

    /** Get a random element from the set. */
    public int getRandom() {
        int i = random.nextInt(list.size());
        return list.get(i);
    }
}
